home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DDJMAG / DDJ8801.ZIP / NARO.ZIP / STABLE.C < prev    next >
Text File  |  1987-10-30  |  2KB  |  80 lines

  1. /*
  2.     Copyright (C) 1987 Paradigm Systems Inc.  All rights reserved.
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <dos.h>
  9.  
  10. #include "loc.h"
  11. #include "externs.h"
  12.  
  13. char    *errstr = "Unable to locate global symbol \"%s\"\n" ;
  14.  
  15.  
  16. void    read_symbol_table(seg_list)
  17. SEG_DESCRIPTOR    *seg_list ;
  18. {
  19.     char    buf[128] ;
  20.     int    count, found ;
  21.     unsigned int    vseg, off;
  22.     char    symbol[32], attrb[10] ;
  23.  
  24.     SEG_DESCRIPTOR    *p ;
  25.     SYMBOL_LIST    *q ;
  26.  
  27.     /*
  28.         This function reads the linker map file and extracts the
  29.         symbol information.
  30.     */
  31.  
  32.     /* Seek to the beginning of the file */
  33.     if (fseek(map_file, 0L, SEEK_SET) != 0)   {
  34.         perror(__FILE__) ;
  35.         exit(1) ;
  36.     }
  37.  
  38.     /* Search thru the file for the symbol tables */
  39.     while (1)   {
  40.         if (fgets(buf, sizeof(buf), map_file) == NULL)
  41.             return ;
  42.  
  43.         if (strstr(strupr(buf), "ADDRESS") != NULL)
  44.             break ;
  45.     }
  46.  
  47.     /* Read each of the symbol entries */
  48.     while (1)   {
  49.         count = fscanf(map_file, " %4x:%4x%5c %s", &vseg, &off, attrb, symbol);
  50.         if (count != 4)
  51.             break ;
  52.         else    {
  53.             p = seg_list ;
  54.             found = FALSE ;
  55.             while (p != NULL)   {
  56.                 if ((p->vseg != vseg) || (p->len == 0))   {
  57.                     p = p->next ;
  58.                     continue ;
  59.                 }
  60.  
  61.                 q = (SYMBOL_LIST *) malloc(sizeof(*q)) ;
  62.                 strcpy(q->name, symbol) ;
  63.                 q->value = off ;
  64.                 q->type = 1 ;
  65.                 q->next = p->symbol_list ;
  66.                 p->symbol_list = q ;
  67.                 p->symbols++ ;
  68.                 found = TRUE ;
  69.                 break ;
  70.             }
  71.  
  72.             if (found == FALSE)
  73.                 fprintf(stderr, errstr, symbol) ;
  74.         }
  75.     }
  76.  
  77.     return ;
  78. }
  79.  
  80.